﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

using modActor;
using modUtileria;
using modDatos;
using modPeticiones;
using modLanGame;

namespace modElenco.Nave
{
    public class CNave : CActor
    {
        CNaveDatos naveDatos = new CNaveDatos();

        public CNave()
        {
            try
            {
                base.init();

                naveDatos.vida = 100;

                data.escenarioDatos.primarykey = "NaveAzul";
                SCutileria.suministratrUtileria(this, "textura2D", data.escenarioDatos.primarykey);
                //SCutileria.suministratrUtileria(this, "textura2D", "NaveAzulDebug");
                data.drawDatos.frameActual = 1;
                data.drawDatos.frameTotal = 1;

                naveDatos.escala = 0.4f;

                data.escenarioDatos.recorte = base.refactorRect();
                data.escenarioDatos.recorte.Width = (int)(data.escenarioDatos.recorte.Width * naveDatos.escala);
                data.escenarioDatos.recorte.Height = (int)(data.escenarioDatos.recorte.Height * naveDatos.escala);

                //data.escenarioDatos.posicion = new Vector2(500, 300);

                Vector2[] posInit = new Vector2[5];
                posInit[0] = new Vector2(60, 40);
                posInit[1] = new Vector2(200, 450);
                posInit[2] = new Vector2(700, 450);
                posInit[3] = new Vector2(900, 30);
                posInit[4] = new Vector2(440, 40);
                
                //data.escenarioDatos.posicion = posInit[CCliente.data.miID];

                naveDatos.velocidad = 10.0f;

                data.espectadorDatos.estadoAnterior = new Dictionary<string, bool>();
                data.espectadorDatos.estadoNuevo = new Dictionary<string, bool>();


                data.espectadorDatos.estadoAnterior.Add("MovIzq", false);
                data.espectadorDatos.estadoAnterior.Add("MovDer", false);
                data.espectadorDatos.estadoAnterior.Add("Quieto", true);
                data.espectadorDatos.estadoAnterior.Add("Arriba", false);
                data.espectadorDatos.estadoAnterior.Add("Abajo", false);

                data.espectadorDatos.estadoAnterior.Add("Vivo", true);
                data.espectadorDatos.estadoAnterior.Add("Zombi", false);
                data.espectadorDatos.estadoAnterior.Add("Muerto", false);

                data.espectadorDatos.estadoAnterior.Add("ChocoTest", false);

                data.espectadorDatos.estadoNuevo = data.espectadorDatos.estadoAnterior;

                data.drawDatos.multiSprite = false;

                data.botLimit = 500;
                data.topLimit = 0;
                data.leftLimit = 950;
                data.rightLimit = 0;

                data.drawDatos.pixelColor = modCollision.SCCollision.GetPixels(data.escenarioDatos.recorte, data.drawDatos.texture);

                naveDatos.ClicPress = false;

                naveDatos.fuente = SCutileria.darFuente("fuenteTest");
            }
            catch (Exception ex)
            {
                string lala = ex.ToString();
                throw;
            }
        }

        public override void ensayar(Microsoft.Xna.Framework.GameTime gameTime)
        {
            base.ensayar(gameTime);

            /*pasos:
              1- se cambia el frame por el correspondiente
              2- se corre la imagen de colicion
              3- logica de colicion
              4- s mueve figura de verdad*/

            //if (data.espectadorDatos.estadoNuevo["Quieto"])
            //{
            //    //data.frameActual = 2;
            //    if (data.frameActual > 2)
            //    {
            //        data.frameActual--;
            //    }
            //    else if (data.frameActual < 2){
            //        data.frameActual++;
            //    }
            //}

            if (data.espectadorDatos.estadoNuevo["Vivo"] || data.espectadorDatos.estadoNuevo["Zombi"])
            {

                if (data.espectadorDatos.estadoNuevo["MovDer"])
                {
                    data.escenarioDatos.posicion += new Vector2(naveDatos.velocidad, 0.0f);                    
                }

                if (data.espectadorDatos.estadoNuevo["MovIzq"])
                {
                    data.escenarioDatos.posicion -= new Vector2(naveDatos.velocidad, 0.0f);
                }

                if (data.espectadorDatos.estadoNuevo["Arriba"])
                {
                    data.escenarioDatos.posicion -= new Vector2(0.0f, naveDatos.velocidad);                 
                }

                if (data.espectadorDatos.estadoNuevo["Abajo"])
                {
                    data.escenarioDatos.posicion += new Vector2(0.0f, naveDatos.velocidad);
                }
            }
           
            //pqEstado_dat datosNave = SCPeticion.DaDatos("NaveAzulTest");
            
            //data.escenarioDatos.recorte.X = (int) data.escenarioDatos.posicion.X;
            //data.escenarioDatos.recorte.Y = (int)data.escenarioDatos.posicion.Y;

            //if (modCollision.SCCollision.DetectBnB(datosNave.posicion, data.escenarioDatos.recorte) != Rectangle.Empty)
            //{
            //    data.espectadorDatos.estadoAnterior["ChocoTest"] = true;
            //}
            //else
            //{
            //    data.espectadorDatos.estadoAnterior["ChocoTest"] = false; ;
            //}

            //establesco los limites del movimiento
            if (data.escenarioDatos.posicion.X > data.leftLimit)
            {
                data.escenarioDatos.posicion.X = data.leftLimit;
            }
            if (data.escenarioDatos.posicion.Y > data.botLimit)
            {
                data.escenarioDatos.posicion.Y = data.botLimit;
            }
            if (data.escenarioDatos.posicion.Y < 0)
            {
                data.escenarioDatos.posicion.Y = 0;
            }
            if (data.escenarioDatos.posicion.X < 0)
            {
                data.escenarioDatos.posicion.X = 0;
            }


            //termino el ensayo, informo de los datos
            //pqActorMini_Datos minDatos = new pqActorMini_Datos();
            //minDatos.Estado = 1;
            //minDatos.pos_x =(int) data.escenarioDatos.posicion.X;
            //minDatos.pos_y =(int) data.escenarioDatos.posicion.Y;
            //minDatos.rotacion = anguloDeRotacion();
            //minDatos.vida = naveDatos.vida;

            //SCPeticion.recivirDatos(data.escenarioDatos.primarykey, minDatos);


            //VERIFICO COLICION CON Asteroides
            CAsteroidesDatos asteroide = new CAsteroidesDatos();

            foreach (KeyValuePair<string, CDataGameBase> item in SCPeticion.BuscarDatos("Asteroid"))
            {
                asteroide = (CAsteroidesDatos)item.Value;

                Rectangle rec = new Rectangle((int) data.escenarioDatos.posicion.X,(int) data.escenarioDatos.posicion.Y, data.escenarioDatos.recorte.Width, data.escenarioDatos.recorte.Height);

                if (modCollision.SCCollision.DetectBnB(rec , new Rectangle((int)asteroide.posicionActual.X, (int)asteroide.posicionActual.Y, 90,90) ) != Rectangle.Empty)
                {
                    naveDatos.vida--;
                    if (naveDatos.vida <= 0)
                    {
                        SCDirector.pasarEscena("Fin");
                    }
                }
                else
                {
                    data.espectadorDatos.estadoAnterior["ChocoTest"] = false; ;
                }
            }


        }

        private float anguloDeRotacion()
        {
            float angulo;

            angulo = (float)Math.Atan2(data.espectadorDatos.newMouseState.Y - data.escenarioDatos.posicion.Y,
                                data.espectadorDatos.newMouseState.X - data.escenarioDatos.posicion.X);

            //angulo = (float)Math.Atan2(data.espectadorDatos.newMouseState.Y - data.escenarioDatos.recorte.Center.Y,
            //        data.espectadorDatos.newMouseState.X - data.escenarioDatos.recorte.Center.X);

            return angulo;
        }

        public override void setearEstadosPorKeyBoard(Microsoft.Xna.Framework.Input.KeyboardState estado)
        {
            base.setearEstadosPorKeyBoard(estado);
            #region aciones de movimiento
            if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A) == true)
            {
                data.espectadorDatos.estadoNuevo["MovIzq"] = true;
                data.espectadorDatos.estadoNuevo["Quieto"] = false;
                data.espectadorDatos.estadoNuevo["MovDer"] = false;

                if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.W) == true)
                {
                    data.espectadorDatos.estadoNuevo["Arriba"] = true;
                    data.espectadorDatos.estadoNuevo["Quieto"] = false;
                    data.espectadorDatos.estadoNuevo["Abajo"] = false;
                }
                else
                {
                    if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.S) == true)
                    {
                        data.espectadorDatos.estadoNuevo["Abajo"] = true;
                        data.espectadorDatos.estadoNuevo["Quieto"] = false;
                        data.espectadorDatos.estadoNuevo["Arriba"] = false;
                    }
                    else
                    {
                        data.espectadorDatos.estadoNuevo["Arriba"] = false;
                        data.espectadorDatos.estadoNuevo["Abajo"] = false;
                    }
                }

            }
            else
            {
                if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.D) == true)
                {
                    data.espectadorDatos.estadoNuevo["MovDer"] = true;
                    data.espectadorDatos.estadoNuevo["Quieto"] = false;
                    data.espectadorDatos.estadoNuevo["MovIzq"] = false;

                    if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.W) == true)
                    {
                        data.espectadorDatos.estadoNuevo["Arriba"] = true;
                        data.espectadorDatos.estadoNuevo["Quieto"] = false;
                        data.espectadorDatos.estadoNuevo["Abajo"] = false;
                    }
                    else
                    {
                        if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.S) == true)
                        {
                            data.espectadorDatos.estadoNuevo["Abajo"] = true;
                            data.espectadorDatos.estadoNuevo["Quieto"] = false;
                            data.espectadorDatos.estadoNuevo["Arriba"] = false;
                        }
                        else
                        {
                            data.espectadorDatos.estadoNuevo["Arriba"] = false;
                            data.espectadorDatos.estadoNuevo["Abajo"] = false;
                        }
                    }
                }
                else
                {
                    if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.W) == true)
                    {
                        data.espectadorDatos.estadoNuevo["Arriba"] = true;
                        data.espectadorDatos.estadoNuevo["Quieto"] = false;
                        data.espectadorDatos.estadoNuevo["Abajo"] = false;

                        if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A) == true)
                        {
                            data.espectadorDatos.estadoNuevo["MovIzq"] = true;
                            data.espectadorDatos.estadoNuevo["Quieto"] = false;
                            data.espectadorDatos.estadoNuevo["MovDer"] = false;
                        }
                        else
                            if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.D) == true)
                            {
                                data.espectadorDatos.estadoNuevo["MovDer"] = true;
                                data.espectadorDatos.estadoNuevo["Quieto"] = false;
                                data.espectadorDatos.estadoNuevo["MovIzq"] = false;
                            }
                            else
                            {
                                data.espectadorDatos.estadoNuevo["MovDer"] = false;
                                data.espectadorDatos.estadoNuevo["MovIzq"] = false;
                            }
                    }
                    else
                    {
                        if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.S) == true)
                        {
                            data.espectadorDatos.estadoNuevo["Abajo"] = true;
                            data.espectadorDatos.estadoNuevo["Quieto"] = false;
                            data.espectadorDatos.estadoNuevo["Arriba"] = false;

                            if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A) == true)
                            {
                                data.espectadorDatos.estadoNuevo["MovIzq"] = true;
                                data.espectadorDatos.estadoNuevo["Quieto"] = false;
                                data.espectadorDatos.estadoNuevo["MovDer"] = false;
                            }
                            else
                                if (estado.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.D) == true)
                                {
                                    data.espectadorDatos.estadoNuevo["MovDer"] = true;
                                    data.espectadorDatos.estadoNuevo["Quieto"] = false;
                                    data.espectadorDatos.estadoNuevo["MovIzq"] = false;
                                }
                                else
                                {
                                    data.espectadorDatos.estadoNuevo["MovDer"] = false;
                                    data.espectadorDatos.estadoNuevo["MovIzq"] = false;
                                }
                        }
                        else
                        {
                            data.espectadorDatos.estadoNuevo["Quieto"] = true;
                            data.espectadorDatos.estadoNuevo["Arriba"] = false;
                            data.espectadorDatos.estadoNuevo["Abajo"] = false;
                            data.espectadorDatos.estadoNuevo["MovIzq"] = false;
                            data.espectadorDatos.estadoNuevo["MovDer"] = false;
                        }
                    }
                }
            }
            #endregion

            #region estados animicos
            if (!data.espectadorDatos.estadoAnterior["Vivo"])
            {

            }
            #endregion
        }

        public override void setearEstadosPorMouse(MouseState estado)
        {
            base.setearEstadosPorMouse(estado);
            if (estado.LeftButton == ButtonState.Pressed)
            {
                naveDatos.ClicPress = true;
            }
            if (naveDatos.ClicPress == true && estado.LeftButton == ButtonState.Released)
            {
                naveDatos.ClicPress = false;

                CBalasDatos nuevaBala = new CBalasDatos();


                //string nameBullet = CCliente.data.miID + "new-Bullet" + SCPeticion.BuscarDatos("Bullet").Count;
                string nameBullet = "new-Bullet" + SCPeticion.BuscarDatos("Bullet").Count;
                nuevaBala.name = "Bullet" + SCPeticion.BuscarDatos("Bullet").Count;
               // nuevaBala.ClienteDunio = CCliente.data.miID;
                nuevaBala.posicionActual.X = data.escenarioDatos.posicion.X + data.escenarioDatos.recorte.Width / 2;
                nuevaBala.posicionActual.Y = data.escenarioDatos.posicion.Y + data.escenarioDatos.recorte.Height / 2;
                nuevaBala.posicionAnterior.X = estado.X;
                nuevaBala.posicionAnterior.Y = estado.Y;
                nuevaBala.vivo = true;

                SCPeticion.DatosGame.Add(nameBullet, (CDataGameBase)nuevaBala);
            }

        }

        public override void drawInEscenary(ref Microsoft.Xna.Framework.Graphics.SpriteBatch sprite)
        {
            //sprite.Draw(CreateRectanlge(data.escenarioDatos.recorte.Width, data.escenarioDatos.recorte.Height, Color.DarkGreen),
            //            data.escenarioDatos.posicion,
            //            null,
            //            Color.White,
            //            0.0f,
            //            new Vector2(0, 0),
            //            1.0f,
            //            SpriteEffects.None,
            //            1);
            
            //creo mi barra de vida
            sprite.Draw(CreateRectanlge(5 * naveDatos.vida, 40, Color.Red),
                        new Vector2((float)data.botLimit - 40, 0),
                        Color.White
                        );

            //unico draw que vale la pena, el resto es de test
             //base.drawInEscenary ( ref sprite );
           
             sprite.Draw(data.drawDatos.texture,
                         new Vector2(data.escenarioDatos.posicion.X + data.escenarioDatos.recorte.Width/2, data.escenarioDatos.posicion.Y + data.escenarioDatos.recorte.Height/2),
                         //new Vector2(data.escenarioDatos.posicion.X, data.escenarioDatos.posicion.Y),
                         null,
                         Color.White,
                         anguloDeRotacion() + MathHelper.ToRadians(90),
                         new Vector2(data.drawDatos.texture.Width/2,data.drawDatos.texture.Height/2),                         
                         //new Vector2(data.escenarioDatos.posicion.X/2, data.escenarioDatos.posicion.Y/2),
                         0.4f,
                         SpriteEffects.None,
                         1);
             data.espectadorDatos.estadoAnterior = data.espectadorDatos.estadoNuevo;

            

            //area de pruebas....

             //Vector2 posicionTexto = new Vector2(0, 0);
             //Vector2 posicionTexto2 = new Vector2(0, 20);
             //Vector2 posicionTexto3 = new Vector2(0, 40);

            
             //string texto = "Posicion nave 1: " + data.escenarioDatos.posicion.X + ";" + data.escenarioDatos.posicion.Y;
             //string texto2 = "Recorte nave 1: " + data.escenarioDatos.recorte.X + ";" + data.escenarioDatos.recorte.Y;

             //sprite.DrawString(naveDatos.fuente, texto, posicionTexto, Color.DarkRed);
             //sprite.DrawString(naveDatos.fuente, texto2, posicionTexto2, Color.DarkRed);
             //sprite.DrawString(naveDatos.fuente, "La colicion es: " + data.espectadorDatos.estadoAnterior["ChocoTest"], posicionTexto3, Color.DarkRed);
        }

        public Texture2D CreateRectanlge(int lado1, int lado2, Color colorito)
        {
            if (lado1 > 0 && lado2 > 0)
            {
                Texture2D texture = new Texture2D(_BlackGlobal.graphics.GraphicsDevice, lado1, lado2);
                Color[] dataColor = new Color[lado1 * lado2];

                for (int i = 0; i < dataColor.Length; ++i)
                {
                    dataColor[i] = colorito;
                }

                texture.SetData(dataColor);
                return texture;
            }

            Texture2D lala = new Texture2D (_BlackGlobal.graphics.GraphicsDevice, 1, 1);

            return lala;
        }
    }
}
